/**
 * 测试东方财富真实API接口
 * 验证能否获取真实的概念板块数据
 */

import fetch from 'node-fetch';

// 东方财富概念板块API (基于公开资料)
async function getEastmoneyConceptBoards() {
  try {
    // 东方财富概念板块列表API
    const url = 'https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery&pn=1&pz=1000&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:90+t:3+f:!50&fields=f2,f3,f4,f12,f13,f14';
    
    console.log('📡 测试东方财富概念板块API...');
    console.log('URL:', url);
    
    const response = await fetch(url, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Referer': 'http://quote.eastmoney.com/center/gridlist.html'
      }
    });

    console.log('Status:', response.status);
    const text = await response.text();
    console.log('响应长度:', text.length);
    console.log('响应前500字符:', text.substring(0, 500));
    
    // 尝试解析JSONP响应
    const jsonMatch = text.match(/jQuery\d+_\d+\((.*)\)/);
    if (jsonMatch) {
      const data = JSON.parse(jsonMatch[1]);
      console.log('✅ 解析成功!');
      console.log('概念板块数量:', data.data?.diff?.length || 0);
      
      if (data.data?.diff) {
        console.log('前5个概念板块:');
        data.data.diff.slice(0, 5).forEach((item, index) => {
          console.log(`  ${index + 1}. ${item.f12} - ${item.f14}`);
        });
      }
      
      return data;
    } else {
      console.log('❌ JSONP解析失败');
      return null;
    }
    
  } catch (error) {
    console.error('❌ 东方财富API调用失败:', error.message);
    return null;
  }
}

// 测试东方财富个股概念API
async function getStockConcepts(stockCode) {
  try {
    // 获取个股所属概念
    const url = `https://emh5.eastmoney.com/api/GaiNianBanKuai/GetGaiNianBanKuaiByCode?code=${stockCode}`;
    
    console.log(`📈 测试获取 ${stockCode} 的概念归属...`);
    
    const response = await fetch(url, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
      }
    });
    
    const data = await response.json();
    console.log('个股概念数据:', JSON.stringify(data, null, 2));
    
    return data;
  } catch (error) {
    console.error('❌ 获取个股概念失败:', error.message);
    return null;
  }
}

// 测试AKShare相关接口（需要Python环境）
async function testAKShareApproach() {
  console.log('📚 AKShare方式说明:');
  console.log('如果要使用AKShare获取分类数据，需要:');
  console.log('1. 安装Python和AKShare: pip install akshare');
  console.log('2. 使用以下代码:');
  console.log(`
import akshare as ak

# 获取概念板块
concept_boards = ak.stock_board_concept_name_em()
print(concept_boards)

# 获取概念板块成分股
concept_stocks = ak.stock_board_concept_cons_em(symbol="人工智能")
print(concept_stocks)
`);
  
  console.log('3. 或通过HTTP API方式调用Python脚本');
}

// 测试同花顺API
async function testTonghuashunAPI() {
  try {
    // 测试同花顺概念板块（可能需要认证）
    console.log('📊 测试同花顺相关接口...');
    
    // 同花顺的API可能需要更复杂的认证
    // 这里只做示例调用
    const url = 'http://basic.10jqka.com.cn/basicapi/stock/class/?hexin-v=A_stock_class&className=概念';
    
    console.log('URL:', url);
    console.log('⚠️  同花顺API通常需要复杂的认证和反爬措施');
    
  } catch (error) {
    console.log('❌ 同花顺API测试跳过');
  }
}

// 主测试函数
async function runAPITests() {
  console.log('🚀 开始测试各数据源API...\n');
  
  // 测试东方财富
  console.log('=== 测试1: 东方财富概念板块 ===');
  const conceptData = await getEastmoneyConceptBoards();
  
  // 测试个股概念归属
  console.log('\n=== 测试2: 个股概念归属 ===');
  await getStockConcepts('600519'); // 茅台
  
  // 说明AKShare方式
  console.log('\n=== 测试3: AKShare方式 ===');
  testAKShareApproach();
  
  // 测试同花顺
  console.log('\n=== 测试4: 同花顺API ===');
  await testTonghuashunAPI();
  
  // 总结建议
  console.log('\n=== 总结建议 ===');
  if (conceptData) {
    console.log('✅ 东方财富API可用，建议方案:');
    console.log('1. 使用东方财富公开API获取概念板块数据');
    console.log('2. 建立股票代码格式转换器');
    console.log('3. 定期同步概念分类数据');
  } else {
    console.log('⚠️  直接API调用受限，替代方案:');
    console.log('1. 使用AKShare Python库作为中间层');
    console.log('2. 建立Node.js到Python的桥接');
    console.log('3. 或者使用已爬取的静态数据');
  }
  
  console.log('\n📋 推荐实施步骤:');
  console.log('1. 先用静态的概念分类数据验证可行性');
  console.log('2. 建立代码转换和匹配逻辑');
  console.log('3. 再集成动态数据源');
}

// 运行测试
runAPITests().catch(console.error);